我今天幫 App 新增了歷史月報與跨月趨勢分析。
前面的功能主要是在看「這個月花了多少」,今天進一步把不同月份的資料整理起來,讓使用者可以比較每個月的收入、支出與變化。
這次接觸到比較多資料處理邏輯,像是 Data Grouping、MoM 成長率、資料排序與防錯處理。
先把不同月份的資料分組
原本每一筆記帳資料只有自己的日期,例如:
2026-07-15
2026-08-03
2026-08-20
2026-09-10
但如果要製作「歷史月報」,就不能一筆一筆看,而是要先把它們整理成:
2026-07 → 收入、支出
2026-08 → 收入、支出
2026-09 → 收入、支出
所以我使用 forEach(),根據日期前 7 個字元,也就是 YYYY-MM,把資料分到對應的月份:
在過程中,我學會了 slice、累計等功能的程式碼,也用了之前學過的 forEach()。這不只是單純地逐筆跑過資料,而是進一步將資料重新分類並進行累加,我從中學會了很多。
遇到資料不完整時,也要先防錯
這次有一個我覺得很重要的地方:
如果直接寫:
當某筆舊資料沒有 date 時,就可能直接出現錯誤。
所以我加上條件判斷:
有日期 → 取出年月
沒有日期 → 歸類到「其他」
不要只是想「正常資料怎麼跑」,也要想「如果資料不完整會怎樣?」
計算每個月的支出變化:MoM
有了每個月的支出資料後,我又加入 MoM(Month-over-Month)月成長率。
公式:
MoM=(本月支出−上月支出)/上月支出×100%
實際寫成 JavaScript:
例如:
上個月:10,000 元
這個月:12,000 元
(12,000 - 10,000) / 10,000 × 100%
= 20%
就可以知道這個月的支出比上個月增加了 20%。
處理上個月是 0 元的特殊情況
MoM 看起來只是套公式,但實際寫程式時還是會遇到特殊情況。
如果我上個月的支出是0元的話要怎麼辦?
所以我在函式最前面先判斷:
**
有時候數學公式能成立,不代表任何輸入資料都能直接套公式。
實際寫程式時,還是要處理邊界條件。**
這邊貼上成果:
總結:
小小的心得:
雖然大部分程式碼還是由 AI 協助完成,但正因如此,我應該更謹慎地去理解這些程式碼。使用 AI 的同時,我也希望自己能清楚知道程式在做什麼、我真正想要的是什麼、哪裡不合邏輯,而不是一味地複製貼上。
過程中多少還是會有想偷懶的時候,但我常常會提醒自己:「如果什麼都直接叫 AI 做,那我自己又學到了什麼?我又可以做什麼?」所以我還是會逼自己去看懂、去思考。對我來說,Vibe Coding 不只是讓 AI 幫我把程式寫出來,而是在 AI 的協助下,慢慢學會理解程式、判斷問題。